#if 1
#include <stdio.h>
#ifdef __linux__
#include <unistd.h>
#endif
#include <stdlib.h>

#include <time.h>
// 定义实现（只在一个源文件中定义）
#define THREAD_POOL_IMPLEMENTATION
#include "tpool.hol.h"

// 示例任务：计算数字的平方并打印结果
void* square_task(void* args) {
    int num = *(int*)args;
    int result = num * num;
    
    // 打印线程ID（跨平台处理）
#ifdef _WIN32
    printf("线程 %lu: 计算 %d 的平方 = %d\n", GetCurrentThreadId(), num, result);
#else
    printf("线程 %lu: 计算 %d 的平方 = %d\n", pthread_self(), num, result);
#endif
    
    free(args);  // 释放动态分配的参数
    return NULL;
}

// 示例任务：模拟耗时操作
void* delay_task(void* args) {
    int task_id = *(int*)args;
    int delay_seconds = (task_id % 3) + 1;  // 1-3秒的延迟
    
#ifdef _WIN32
    printf("线程 %lu: 任务 %d 开始，将延迟 %d 秒\n", GetCurrentThreadId(), task_id, delay_seconds);
    Sleep(delay_seconds * 1000);  // Windows使用Sleep（毫秒）
#else
    printf("线程 %lu: 任务 %d 开始，将延迟 %d 秒\n", pthread_self(), task_id, delay_seconds);
    sleep(delay_seconds);  // POSIX系统使用sleep（秒）
#endif
    
    printf("线程 %d: 任务 %d 完成\n", task_id, task_id);
    free(args);
    return NULL;
}

int main() {
    // 1. 初始化随机数生成器
    srand((unsigned int)time(NULL));
    
    // 2. 创建包含3个工作线程的线程池
    tpool_t pool;
    tpool_new(&pool, 3);
    printf("线程池创建完成，包含 %d 个工作线程\n", pool.size);
    
    // 3. 添加一批平方计算任务
    printf("\n=== 添加平方计算任务 ===\n");
    for (int i = 1; i <= 5; i++) {
        int* num = (int*)malloc(sizeof(int));
        *num = i;
        tpool_push(&pool, square_task, num);
    }
    
    // 等待平方任务完成（简单延迟，实际应用需更完善的同步）
#ifdef _WIN32
    Sleep(2000);
#else
    sleep(2);
#endif
    
    // 4. 添加一批延迟任务
    printf("\n=== 添加延迟任务 ===\n");
    for (int i = 0; i < 4; i++) {
        int* task_id = (int*)malloc(sizeof(int));
        *task_id = i;
        tpool_push(&pool, delay_task, task_id);
    }
    
    // 5. 等待所有任务完成
    printf("\n等待所有任务完成...\n");
#ifdef _WIN32
    Sleep(5000);  // Windows使用毫秒
#else
    sleep(5);     // POSIX系统使用秒
#endif
    
    // 6. 销毁线程池，释放资源
    tpool_finish(&pool);
    printf("\n线程池已销毁，所有资源已释放\n");
    
    return 0;
}
#endif


#if 0
#include <stdio.h>
#include <assert.h>
#define THREAD_POOL_IMPLEMENTATION
#include "tpool.hol.h"
#include <unistd.h>

typedef struct {
	int start;
	int end;
} args_t;

void*
hello(void* args)
{
	args_t args_hello = *((args_t*) args);
	int start = args_hello.start,
		end = args_hello.end;
	for(int i = start; i<end; i++);
	printf("Done -> %d to %d\n", start, end);
}

void
test()
{
	printf("\n!!--CRUD Test--!!\n");

	printf("Thread Pool Initialization...");
	tpool_t p;
	tpool_new(&p, 2);
	assert(p.size == 2);
	assert(p.threads != NULL);
	printf("OK ✅\n");

	printf("Thread Pool Push...\n");
	args_t args1 = {13, 304309},
			args2 = {3453, 4459482},
			args3 = {0, 348398249};
	tpool_push(&p, hello, &args1);
	tpool_push(&p, hello, &args2);
	tpool_push(&p, hello, &args3);
	sleep(1);
	printf("OK ✅\n");

	printf("Thread Pool Free...");
	tpool_finish(&p);
	printf("OK ✅\n");
}

int
main()
{
	test();
	return 0;
}
#endif 